<?php
/**
 * 验证码函数
 * User: Administrator
 * Date: 2018/12/20 0020
 * Time: 上午 9:50
 */

require_once 'string.fun.php';#引入文件
/**
 * 通过GD库做验证码
 * @param int $type 随机数的类型 1数字 2字母 3数字+字母
 * @param int $length 随机数的长度
 * @param int $pixel 干扰验证码的点数
 * @param int $line 干扰验证码的线的数量
 * @param string $sess_name 匹配验证码
 */
function verifyImage($type=1,$length=4,$pixel=0,$line=0,$sess_name = "verify"){
    $width = 80;
    $height = 28;
    $image = imagecreatetruecolor($width, $height);#创建画幕
    $while = imagecolorallocate($image, 255, 255, 255);#创建白色底色

    //白色填充画布
    imagefilledrectangle($image, 1, 1, $width - 2, $height - 2, $while);

    //调用函数
    $chars = buildRandomString($type, $length);
    //对比session
    $_SESSION[$sess_name] = $chars;
    #字体文件
    $fontfiles = array("SIMYOU.TTF");
    for ($i = 0; $i < $length; $i++) {
        $size = mt_rand(14, 18);#大小
        $angle = mt_rand(-15, 15);
        $x = 5 + $i * $size;
        $y = mt_rand(20, 26);
        $color = imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
        $fontfile = "../fonts/" . $fontfiles [mt_rand(0, count($fontfiles) - 1)];#字体文件
        $text = substr($chars, $i, 1);#随机字符串
        imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
    }
    #实现点的干扰，通过for循环增加点的数量，点的数量设置为200以内
    if ($pixel) {
        for ($i = 0; $i < $pixel; $i++) {
            #干扰元素的颜色必须比数字的颜色浅，不然会影响用户的正确填写
            $pointcolor = imagecolorallocate($image, rand(50, 200), rand(50, 200), rand(50, 200));
            #画一个单一像素bool imagesetpixel ( resource $image , int $x , int $y , int$color )
            imagesetpixel($image, rand(1, $width - 2), rand(1, $height - 2), $pointcolor);
        }
    }

    #实现线的干扰
    if ($line) {
        for ($i = 0; $i < $line; $i++) {
            $linecolor = imagecolorallocate($image, rand(80, 220), rand(80, 220), rand(80, 220));
            #画一条线段bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
            imageline($image, rand(1, $width - 2), rand(1, $height - 2), rand(1, $width - 2), rand(1, $height - 2), $linecolor);
        }
    }
    //header('content-type:image/png');#声明将要输出内容png的格式
    header("content-type:image/gif");
    imagegif($image);
    imagedestroy($image);
}

/**
 * 生成缩略图
 * @param $filename @文件名
 * @param null $destination @指定文件
 * @param null $dst_w @目标文件的宽
 * @param null $dst_h @目标文件的高
 * @param bool $isReservedSource @保留资源？
 * @param float $scale @比例
 * @return null|string
 */
function thumb($filename,$destination=null,$dst_w=null,$dst_h=null,$isReservedSource=true,$scale=0.5){
    list($src_w,$src_h,$imagetype) = getimagesize($filename);#取得图像大小
    if (is_null($dst_w)||is_null($dst_h)){
        $dst_w = ceil($src_w*$scale);
        $dst_h = ceil($src_h*$scale);
    }
    #取得getimagesize,exif_read_data,exif_thumbnail,exif_imagetype所返回的图像类型的 MIME 类型
    $mime = image_type_to_mime_type($imagetype);
    $createFun = str_replace("/","createfrom",$mime);
    $outFun = str_replace("/",null,$mime);
    $src_image = $createFun($filename);
    $dst_image = imagecreatetruecolor($dst_w,$dst_h);#新建一个真彩色图像
    #重采样拷贝部分图像并调整大小
    imagecopyresampled($dst_image,$src_image,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);
    if ($destination && !file_exists(dirname($destination))){
        mkdir(dirname($destination),077,true);#新建一个由 $destination 指定的目录。
    }
    $dstFilename = $destination == null ? getUniName().".".getExt($filename) : $destination;
    $outFun($dst_image,$dstFilename);
    imagedestroy($src_image);#养成好习惯，销毁图片，便于回收
    imagedestroy($dst_image);
    if (!$isReservedSource){
        unlink($filename);
    }
    return $dstFilename;
}

/**
 * 添加文字水印
 * @param $filename @文件名
 * @param string $text @水印文字
 * @param string $fontfile @文字类型
 */
function WaterText($filename,$text="test.cn",$fontfile="SIMYOU.TTF"){
    $fileInfo = getimagesize($filename);
    $mime = $fileInfo ['mime'];
    $createFun = str_replace("/","createfrom",$mime);
    $outFun = str_replace("/",null,$mime);
    $image = $createFun($filename);
    $color = imagecolorallocatealpha($image,255,0,0,50);
    $fontfile = "../fonts/{$fontfile}";
    imagettftext($image,14,0,0,14,$color,$fontfile,$text);
    $outFun($image,$filename);
    imagedestroy($image);
}

/**
 * 图像水印
 * @param $dstFile @指定文件
 * @param string $srcFile
 * @param int $pct 图像合并程度
 */
function waterPicture($dstFile,$srcFile="../images/logo.jpg",$pct=30){
    $srcFileInfo = getimagesize($srcFile);
    $src_w = $srcFileInfo[0];
    $src_h = $srcFileInfo[1];
    $dstFileInfo = getimagesize($dstFile);
    $srcMime = $srcFileInfo['mime'];
    $dstMime = $dstFileInfo['mime'];
    $createSrcFun = str_replace("/","createfrom",$srcMime);#要替换的值，替换后的值，替换字符串
    $createDstFun = str_replace("/","createfrom",$dstMime);
    $outDstFun = str_replace("/",null,$dstMime);
    $dst_img = $createDstFun($dstFile);
    $src_img = $createSrcFun($srcFile);
    #拷贝并合并图像的一部分,根据 pct 来决定合并程度，其值范围从 0 到 100
    imagecopymerge($dst_img,$src_img,0,0,0,0,$src_w,$src_h,$pct);
    $outDstFun($dst_img,$dstFile);
    imagedestroy($src_img);#养成习惯，销毁图像，便于系统回收
    imagedestroy($dst_img);
}




